package com.neusoft.liduan.d0916;

public class 异常处理 {
	/*	Java异常处理
	 * 		异常：就是不正常的情况
	 * 			错误，无法处理，只能修改源代码，由Java虚拟机处理不了，比如内存溢出
	 * 			异常，比如输入异常，要求输入数字，结果输入字符串或者要求输入邮箱，结果输入的是数字
	 * 		异常：会中断程序运行，如果想要异常不中断程序，那么就必须处理异常。
	 * 			运行时异常
	 * 				数组索引越界异常、空指针异常、类型转换异常、算术异常、非法参数异常（实参与形参不一致）、数字格式异常
	 * 				非法参数异常：即传入的参数不合法
	 * 			编译时异常
	 * 		抛出异常给上一级，即方法的调用者
	 * 			格式：权限修饰符 [static] 返回值类型 方法名() throws 异常列表 {} 
	 * 		异常处理：当发生异常时，告诉程序如何解决。然后程序就不会中断了。
	 * 			格式：try {
	 * 					可能会出现异常的代码一定在try里面，否则报错
	 * 					也可以写不会出现异常的代码
	 * 				} catch(异常名称 e) {
	 * 					//捕获的异常保存在e中，异常名称不能乱写
	 * 					//当异常发生时，处理代码
	 * 				}
	 * 		java异常类
	 * 			所在包：java.lang
	 * 			Throwable：是所有异常的父类
	 * 				Error：错误，由程序员导致的
	 * 				Exception：异常，由用户导致的，程序员需要提前写代码处理
	 * 					运行时异常：RunTimeException
	 * 						
	 * 					编译时异常
	 *		try-catch
	 *			注意：
	 *				1、同名异常只能捕获一次
	 *				2、所有异常都可以通过Exception来捕获
	 *				3、通过Exception来捕获异常的catch语句只能写在最后
	 *		try-catch-finally
	 *			finally：代码块不管异常如何处理，都会执行
	 *
	 *		触发异常：主要使用在自定义异常上
	 *			关键字：throw
	 *			格式：throw 异常对象
	 *		自定义异常
	 *			一般是继承Exception类
	 */

	public static void main(String[] args){
//		System.out.println(t2());
//		t3();
		try {
			t4();
		} catch (MyException e) {
			e.printStackTrace();
			System.out.println("直接开除");
		}
	}
	
	public static void t4() throws MyException {
		boolean zuojiao = true;
		if(zuojiao) {
//			return
			throw new MyException();
		}
	}
	
	public static void t3() {
		throw new IllegalArgumentException("自定义的非法参数异常");//也可以写try-catch处理该异常
		//直接触发异常，以上写法，主要使用在自定义异常上
//		System.out.println(1);//执行不到的
	}
	
	public static void t0() {
//		Fu fu = new Fu();
//		Zi zi = (Zi) fu;
//		System.out.println(1 / 0);//算术异常

//		Integer.valueOf("123b");
//		System.out.println(1);
//		try {
//			t1();
//		} catch (NumberFormatException e) {
//			System.out.println("异常正在处理");
//		}
//		System.out.println(1);
		//请处理刚刚讲过运行时异常
//		try {
//			System.out.println(1 / 0);
//		} catch(ArithmeticException e) {
//			e.printStackTrace();//打印异常信息
//		}
//		try {
//			String s = null;
//			System.out.println(s.toString());
//		} catch(NullPointerException e) {
//			e.printStackTrace();//打印异常信息
//		}
		
		//try-catch的几种写法
		try {
			int i = 0;
			System.out.println(1 / i);//抛出异常，那么后面不会执行了，直接运行catch块
			String s = null;
			System.out.println(s.toString());
		} catch(ArithmeticException e) {
			System.out.println("abcArithmeticException");
			e.printStackTrace();//打印异常信息
		} catch(NullPointerException e) {
			System.out.println("avcNullPointerException");
			e.printStackTrace();//打印异常信息
		} catch(Exception e) {
			System.out.println("abcException");
			e.printStackTrace();//打印异常信息
		} finally {
			System.out.println("finally");
		}
//		int a = 100;
//		if(a > 0) {
//			
//		}else if(a > 10) {
//			
//		}
//		catch(ArithmeticException e) {
//			e.printStackTrace();//打印异常信息
//		}
//		return;
//		while(true) {
//			
//		}
		System.out.println("程序结束");
	}
	
	public static void t1() throws NumberFormatException {
		Integer.valueOf("123b");
		System.out.println(1);
	}
	
	public static int t2() {
		//应该避免写出如下代码，也是面试题
		try {
			int i = 0;
			System.out.println(1 / i);
			return 1;
		} catch(Exception e) {
			e.printStackTrace();//打印异常信息
			return 2;
		} finally {
			System.out.println("finally");
			return 3;
		}
		
		//return 4;
	}

}
